package com.leezai.mqtt.utils;

import com.leezai.mqtt.subsrict.MqttSubscriberClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.util.HashSet;
import java.util.Set;


public class WorkdayCalculatorUtils {

    private static final Logger log = LoggerFactory.getLogger(WorkdayCalculatorUtils.class);

    // 存储法定节假日的集合（可以根据实际需求添加）
    private final Set<LocalDate> holidays = new HashSet<>();

    /**
     * 计算两个日期之间的工作日天数（包含起始日期，不包含结束日期）
     * 默认周一至周五为工作日，周六周日为休息日
     *
     * @param startDate 起始日期
     * @param endDate   结束日期
     * @return 工作日天数
     */
    public int calculateWorkdays(LocalDate startDate, LocalDate endDate) {
        if (startDate.isAfter(endDate)) {
            throw new IllegalArgumentException("起始日期不能晚于结束日期");
        }

        int workdays = 0;
        LocalDate currentDate = startDate;

        while (currentDate.isBefore(endDate)) {
            // 检查是否为工作日（周一到周五）且不是节假日
            if (isWorkday(currentDate)) {
                workdays++;
            }
            currentDate = currentDate.plusDays(1);
        }

        return workdays;
    }

    /**
     * 计算两个日期之间的工作日天数（包含起始日期和结束日期）
     *
     * @param startDate 起始日期
     * @param endDate   结束日期
     * @return 工作日天数
     */
    public int calculateWorkdaysInclusive(LocalDate startDate, LocalDate endDate) {
        return calculateWorkdays(startDate, endDate.plusDays(1));
    }

    /**
     * 判断指定日期是否为工作日
     *
     * @param date 待判断的日期
     * @return 是否为工作日
     */
    public boolean isWorkday(LocalDate date) {
        // 检查是否为周末
        DayOfWeek dayOfWeek = date.getDayOfWeek();
        if (dayOfWeek == DayOfWeek.SATURDAY || dayOfWeek == DayOfWeek.SUNDAY) {
            return false;
        }

        // 检查是否为法定节假日
        if (holidays.contains(date)) {
            return false;
        }

        return true;
    }

    /**
     * 添加法定节假日
     *
     * @param holiday 节假日日期
     */
    public void addHoliday(LocalDate holiday) {
        holidays.add(holiday);
    }

    /**
     * 批量添加法定节假日
     *
     * @param holidays 节假日日期集合
     */
    public void addHolidays(Set<LocalDate> holidays) {
        this.holidays.addAll(holidays);
    }

    /**
     * 移除法定节假日
     *
     * @param holiday 节假日日期
     */
    public void removeHoliday(LocalDate holiday) {
        holidays.remove(holiday);
    }

    /**
     * 清空所有法定节假日
     */
    public void clearHolidays() {
        holidays.clear();
    }

    /**
     * 获取已设置的节假日列表
     *
     * @return 节假日集合
     */
    public Set<LocalDate> getHolidays() {
        return new HashSet<>(holidays);
    }


    public static void main(String[] args) {
        WorkdayCalculatorUtils calculator = new WorkdayCalculatorUtils();

        // 设置一些法定节假日
//        calculator.addHoliday(LocalDate.of(2024, 1, 1));  // 元旦
//        calculator.addHoliday(LocalDate.of(2024, 5, 1));  // 劳动节
//        calculator.addHoliday(LocalDate.of(2024, 10, 1)); // 国庆节

        // 计算工作日
        LocalDate start = LocalDate.of(2025, 9, 9);
        LocalDate end = LocalDate.of(2025, 12, 30);

        long totalDays = java.time.temporal.ChronoUnit.DAYS.between(start, end);

        int workdays = calculator.calculateWorkdaysInclusive(start, end);
        System.out.println("从 " + start + " 到 " + end + " 共有 " + workdays + " 个工作日");
        System.out.println("总计: " + totalDays + " 天");
        log.error("eeee");

        // 包含结束日期的计算
//        int workdaysInclusive = calculator.calculateWorkdaysInclusive(start, end);
//        System.out.println("从 " + start + " 到 " + end + "（包含结束日期）共有 " + workdaysInclusive + " 个工作日");
    }

}
